Podemos cambiar el entorno de un contexto usando addToEnvironment() y removeFromEnvironment().
Aqu� tenemos un ejemplo que crea un contexto inicial y obtiene un contexto derivado desde el contexto inicial (mediante lookup()).
Luego actualiza los entornos del contexto inicial y del contexto derivado.
// Initial environment with various properties
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.FSContextFactory");
env.put(Context.PROVIDER_URL, "file:/");
env.put(Context.OBJECT_FACTORIES, "foo.bar.ObjFactory");
env.put("foo", "bar");
// Call the constructor
Context ctx = new InitialContext(env);
// Get the child context
Context child = (Context)ctx.lookup("tmp");
// See what properties the initial context has
System.out.println(ctx.getEnvironment());
// Replace foo in the parent
ctx.addToEnvironment("foo", "baz");
// Add a new property to the parent
ctx.addToEnvironment("com.wiz.jndi.wizProp", "wizards");
// Remove an attribute from the parent
ctx.removeFromEnvironment(Context.OBJECT_FACTORIES);
// Remote property from the child
child.removeFromEnvironment(Context.PROVIDER_URL);
// See what environment properties you have after updates
System.out.println(">>>>> Parent context: ");
System.out.println(ctx.getEnvironment());
// See what environment properties the child has after updates
System.out.println(">>>>> Child context: ");
System.out.println(child.getEnvironment());
Aqu� tenemos la salida al ejecutar el ejemplo, observa que estas actualizaciones s�lo afectan al ejemplar de Context en el que se realizan.
{
com.sun.jndi.ldap.netscape.schemaBugs=true,
java.naming.factory.object=foo.bar.ObjFactory:com.sun.jndi.ldap.AttrsToCorba:com.wiz.from.Person,
java.naming.factory.initial=com.sun.jndi.fscontext.FSContextFactory,
foo=bar,
java.naming.provider.url=file:/,
java.naming.factory.state=com.sun.jndi.ldap.CorbaToAttrs:com.wiz.from.Person,
java.naming.factory.control=com.sun.jndi.ldap.ResponseControlFactory
}
>>>>> Parent context.
{
com.sun.jndi.ldap.netscape.schemaBugs=true,
com.wiz.jndi.wizProp=wizards,
java.naming.factory.initial=com.sun.jndi.fscontext.FSContextFactory,
foo=baz,
java.naming.provider.url=file:/,
java.naming.factory.state=com.sun.jndi.ldap.CorbaToAttrs:com.wiz.from.Person,
java.naming.factory.control=com.sun.jndi.ldap.ResponseControlFactory
}
>>>>> Child context.
{
com.sun.jndi.ldap.netscape.schemaBugs=true,
java.naming.factory.object=foo.bar.ObjFactory:com.sun.jndi.ldap.AttrsToCorba:com.wiz.from.Person,
java.naming.factory.initial=com.sun.jndi.fscontext.FSContextFactory,
foo=bar,
java.naming.factory.state=com.sun.jndi.ldap.CorbaToAttrs:com.wiz.from.Person,
java.naming.factory.control=com.sun.jndi.ldap.ResponseControlFactory
}
��mbito de Cambios
Como se ha visto en el ejemplo anterior, cambiar la propieades de entorno de un contexto no afecta a ninguno de sus contexto derivados. Sin embargo, los contextos que se deriven en el futuro desde este contexto heredar�n el entorno actualizado.
�Valores por Defecto
Algunas propiedades de entorno tienen valores por defecto. Por ejemplo, una implementaci�n podr�a ignorar las referencias por defecto a menos que la propiedad de entorno "java.naming.referral" se haya configurado a "throw" o "follow".
Cuando dicha propiedad es eliminada usando removeFromEnvironment(), el valor por defecto se convierte en el valor efectivo de la propiedad, aunque el valor real podr�a no mostrarse necesariamente cuando examinamos las propiedades de contexto usando getEnvironment().
�Verificar la Actualizaci�n
Despu�s de actualizar un entorno de contexto, podemos verificarlo inmediatamente usando getEnvironment(). Sin embargo, frecuentemente una propiedad de entorno representa una aspecto de comportamiento del contexto, por ejemplo, las credenciales a usar cuando se entra en el servidor. En dichos casos, no hay garant�a de que que la propiedad haya sido actualizada y el contexto haya verificado las correcci�n y aplicabilidad de la propiedad. Esto es porque podr�a requerir interacci�n del servidor. La siguiente vez que el contexto necesite usar la propiedad, ocurrir� la verificaci�n. En ese momento se podr�a indicar un fallo.
Por ejemplo, supongamos que hemos usado addToEnvironment() tres veces para actualizar las identidades, las credenciales y el tipo de autentificaci�n de los clientes. Supongamos que hemos suministrado unas credenciales err�neas. La pr�xima vez que llamemos al m�todo que requiere la autentificaci�n en el conexto, el proveedor de servicio intentar� autentificarse usando las propiedades actualizadas. Sin embargo, la autentificaci�n fallar� a causa de las credenciales err�neas y obtendremos una AuthenticationException.